Preload

Preload things.

# Prepare stuff
setwd("E:/")
The working directory was changed to E:/ inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the the working directory for notebook chunks.
library(recommenderlab)
Loading required package: Matrix
Loading required package: arules

Attaching package: ‘arules’

The following objects are masked from ‘package:base’:

    abbreviate, write

Loading required package: proxy

Attaching package: ‘proxy’

The following object is masked from ‘package:Matrix’:

    as.matrix

The following objects are masked from ‘package:stats’:

    as.dist, dist

The following object is masked from ‘package:base’:

    as.matrix

Loading required package: registry
library(data.table)
data.table 1.9.7 IN DEVELOPMENT built 2016-10-04 15:45:32 UTC; travis
unable to identify current timezone 'C':
please set environment variable 'TZ'  The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
  Documentation: ?data.table, example(data.table) and browseVignettes("data.table")
  Release notes, videos and slides: http://r-datatable.com
library(infotheo)

Attaching package: ‘infotheo’

The following object is masked from ‘package:arules’:

    discretize
library(DT)
library(R.utils)
Loading required package: R.oo
Loading required package: R.methodsS3
R.methodsS3 v1.7.1 (2016-02-15) successfully loaded. See ?R.methodsS3 for help.
R.oo v1.20.0 (2016-02-17) successfully loaded. See ?R.oo for help.

Attaching package: ‘R.oo’

The following objects are masked from ‘package:methods’:

    getClasses, getMethods

The following objects are masked from ‘package:base’:

    attach, detach, gc, load, save

R.utils v2.4.0 (2016-09-13) successfully loaded. See ?R.utils for help.

Attaching package: ‘R.utils’

The following object is masked from ‘package:recommenderlab’:

    evaluate

The following object is masked from ‘package:utils’:

    timestamp

The following objects are masked from ‘package:base’:

    cat, commandArgs, getOption, inherits, isOpen, parse, warnings
library(doParallel)
Loading required package: foreach
foreach: simple, scalable parallel programming from Revolution Analytics
Use Revolution R for scalability, fault tolerance and more.
http://www.revolutionanalytics.com
Loading required package: iterators
Loading required package: parallel
library(foreach)
library(rpart)
library(woe)
library(knitr)
library(rmarkdown)
library(ggplot2)
library(colorplaner)
library(ggiraph)
library(gridExtra)
# Load data
numeric <- readRDS("datasets/train_numeric.rds")
gc(verbose = TRUE)
Garbage collection 91 = 42+10+39 (level 2) ... 
88.7 Mbytes of cons cells used (63%)
8770.4 Mbytes of vectors used (73%)
             used   (Mb) gc trigger    (Mb)   max used   (Mb)
Ncells    1660318   88.7    2637877   140.9    2164898  115.7
Vcells 1149553334 8770.4 1568815419 11969.2 1149560573 8770.5
# Prepare data
target <- numeric$Response
gc(verbose = TRUE)
Garbage collection 92 = 42+10+40 (level 2) ... 
88.8 Mbytes of cons cells used (63%)
8770.5 Mbytes of vectors used (61%)
             used   (Mb) gc trigger    (Mb)   max used   (Mb)
Ncells    1662535   88.8    2637877   140.9    2164898  115.7
Vcells 1149554173 8770.5 1882658502 14363.6 1149579090 8770.6
feature_names <- fread("Laurae/date_feat_lut_V2.txt", header = TRUE)
feature_names <- feature_names[!name_num == "", ]
feature_names <- feature_names[, c("name_num", "station_V2", "line", "station", "feature_nr"), with = FALSE]
colnames(feature_names) <- c("Feature", "Station", "Line", "Orig_St", "Feat_Nb")
gc(verbose = TRUE)
Garbage collection 93 = 42+10+41 (level 2) ... 
90.2 Mbytes of cons cells used (64%)
8770.9 Mbytes of vectors used (61%)
             used   (Mb) gc trigger    (Mb)   max used   (Mb)
Ncells    1687620   90.2    2637877   140.9    2164898  115.7
Vcells 1149617258 8770.9 1882658502 14363.6 1149998151 8773.8
used_columns <- fread("E:/Laurae/TimeSeries/used_columns.csv")$x
numeric <- numeric[, used_columns, with = FALSE]
gc(verbose = TRUE)
Garbage collection 95 = 42+10+43 (level 2) ... 
90.2 Mbytes of cons cells used (64%)
7669.1 Mbytes of vectors used (44%)
             used   (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells    1688023   90.2    2637877   140.9    2164898   115.7
Vcells 1005194571 7669.1 2260511758 17246.4 2152269091 16420.6
for (i in used_columns) {
  j <- paste(i, "_residuals", sep = "")
  numeric[, (j) := fread(paste("E:/Laurae/TimeSeries/", i, "_TS.csv", sep = ""), header = TRUE, select = 2, showProgress = FALSE)$Residuals[1:1183747]]
  cat("Loaded ", i, ".\n")
}
Loaded  L0_S0_F0 .
Loaded  L0_S0_F2 .
Loaded  L0_S0_F4 .
Loaded  L0_S0_F6 .
Loaded  L0_S0_F8 .
Loaded  L0_S0_F10 .
Loaded  L0_S0_F12 .
Loaded  L0_S0_F14 .
Loaded  L0_S0_F16 .
Loaded  L0_S0_F18 .
Loaded  L0_S0_F20 .
Loaded  L0_S0_F22 .
Loaded  L0_S1_F24 .
Loaded  L0_S1_F28 .
Loaded  L0_S2_F36 .
Loaded  L0_S2_F44 .
Loaded  L0_S2_F48 .
Loaded  L0_S2_F60 .
Loaded  L0_S2_F64 .
Loaded  L0_S3_F72 .
Loaded  L0_S3_F80 .
Loaded  L0_S3_F84 .
Loaded  L0_S3_F96 .
Loaded  L0_S3_F100 .
Loaded  L0_S4_F104 .
Loaded  L0_S4_F109 .
Loaded  L0_S5_F114 .
Loaded  L0_S5_F116 .
Loaded  L0_S6_F122 .
Loaded  L0_S6_F132 .
Loaded  L0_S7_F138 .
Loaded  L0_S7_F142 .
Loaded  L0_S8_F146 .
Loaded  L0_S8_F149 .
Loaded  L0_S9_F155 .
Loaded  L0_S9_F160 .
Loaded  L0_S9_F165 .
Loaded  L0_S9_F170 .
Loaded  L0_S9_F180 .
Loaded  L0_S9_F185 .
Loaded  L0_S9_F190 .
Loaded  L0_S9_F195 .
Loaded  L0_S9_F200 .
Loaded  L0_S9_F205 .
Loaded  L0_S9_F210 .
Loaded  L0_S10_F219 .
Loaded  L0_S10_F224 .
Loaded  L0_S10_F229 .
Loaded  L0_S10_F234 .
Loaded  L0_S10_F244 .
Loaded  L0_S10_F249 .
Loaded  L0_S10_F254 .
Loaded  L0_S10_F259 .
Loaded  L0_S10_F264 .
Loaded  L0_S10_F269 .
Loaded  L0_S10_F274 .
Loaded  L0_S11_F282 .
Loaded  L0_S11_F286 .
Loaded  L0_S11_F290 .
Loaded  L0_S11_F294 .
Loaded  L0_S11_F302 .
Loaded  L0_S11_F306 .
Loaded  L0_S11_F310 .
Loaded  L0_S11_F314 .
Loaded  L0_S11_F318 .
Loaded  L0_S11_F322 .
Loaded  L0_S11_F326 .
Loaded  L0_S12_F330 .
Loaded  L0_S12_F332 .
Loaded  L0_S12_F334 .
Loaded  L0_S12_F336 .
Loaded  L0_S12_F338 .
Loaded  L0_S12_F342 .
Loaded  L0_S12_F344 .
Loaded  L0_S12_F346 .
Loaded  L0_S12_F348 .
Loaded  L0_S12_F350 .
Loaded  L0_S12_F352 .
Loaded  L0_S13_F354 .
Loaded  L0_S13_F356 .
Loaded  L0_S14_F362 .
Loaded  L0_S14_F370 .
Loaded  L0_S14_F374 .
Loaded  L0_S14_F386 .
Loaded  L0_S14_F390 .
Loaded  L0_S15_F397 .
Loaded  L0_S15_F403 .
Loaded  L0_S15_F406 .
Loaded  L0_S15_F415 .
Loaded  L0_S15_F418 .
Loaded  L0_S16_F421 .
Loaded  L0_S16_F426 .
Loaded  L0_S17_F431 .
Loaded  L0_S17_F433 .
Loaded  L0_S18_F439 .
Loaded  L0_S18_F449 .
Loaded  L0_S19_F455 .
Loaded  L0_S19_F459 .
Loaded  L0_S20_F466 .
Loaded  L0_S21_F472 .
Loaded  L0_S21_F477 .
Loaded  L0_S21_F482 .
Loaded  L0_S21_F487 .
Loaded  L0_S21_F497 .
Loaded  L0_S21_F502 .
Loaded  L0_S21_F507 .
Loaded  L0_S21_F512 .
Loaded  L0_S21_F517 .
Loaded  L0_S21_F522 .
Loaded  L0_S21_F527 .
Loaded  L0_S21_F532 .
Loaded  L0_S21_F537 .
Loaded  L0_S22_F546 .
Loaded  L0_S22_F551 .
Loaded  L0_S22_F556 .
Loaded  L0_S22_F561 .
Loaded  L0_S22_F571 .
Loaded  L0_S22_F576 .
Loaded  L0_S22_F581 .
Loaded  L0_S22_F586 .
Loaded  L0_S22_F591 .
Loaded  L0_S22_F596 .
Loaded  L0_S22_F601 .
Loaded  L0_S22_F606 .
Loaded  L0_S22_F611 .
Loaded  L0_S23_F619 .
Loaded  L0_S23_F623 .
Loaded  L0_S23_F627 .
Loaded  L0_S23_F631 .
Loaded  L0_S23_F639 .
Loaded  L0_S23_F643 .
Loaded  L0_S23_F647 .
Loaded  L0_S23_F651 .
Loaded  L0_S23_F655 .
Loaded  L0_S23_F659 .
Loaded  L0_S23_F663 .
Loaded  L0_S23_F667 .
Loaded  L0_S23_F671 .
Loaded  L1_S24_F679 .
Loaded  L1_S24_F683 .
Loaded  L1_S24_F687 .
Loaded  L1_S24_F691 .
Loaded  L1_S24_F700 .
Loaded  L1_S24_F728 .
Loaded  L1_S24_F733 .
Loaded  L1_S24_F800 .
Loaded  L1_S24_F802 .
Loaded  L1_S24_F806 .
Loaded  L1_S24_F808 .
Loaded  L1_S24_F810 .
Loaded  L1_S24_F812 .
Loaded  L1_S24_F814 .
Loaded  L1_S24_F816 .
Loaded  L1_S24_F829 .
Loaded  L1_S24_F834 .
Loaded  L1_S24_F844 .
Loaded  L1_S24_F857 .
Loaded  L1_S24_F862 .
Loaded  L1_S24_F867 .
Loaded  L1_S24_F872 .
Loaded  L1_S24_F877 .
Loaded  L1_S24_F882 .
Loaded  L1_S24_F887 .
Loaded  L1_S24_F892 .
Loaded  L1_S24_F897 .
Loaded  L1_S24_F902 .
Loaded  L1_S24_F907 .
Loaded  L1_S24_F920 .
Loaded  L1_S24_F925 .
Loaded  L1_S24_F935 .
Loaded  L1_S24_F948 .
Loaded  L1_S24_F953 .
Loaded  L1_S24_F958 .
Loaded  L1_S24_F963 .
Loaded  L1_S24_F968 .
Loaded  L1_S24_F973 .
Loaded  L1_S24_F978 .
Loaded  L1_S24_F983 .
Loaded  L1_S24_F988 .
Loaded  L1_S24_F993 .
Loaded  L1_S24_F998 .
Loaded  L1_S24_F1000 .
Loaded  L1_S24_F1002 .
Loaded  L1_S24_F1004 .
Loaded  L1_S24_F1006 .
Loaded  L1_S24_F1008 .
Loaded  L1_S24_F1010 .
Loaded  L1_S24_F1012 .
Loaded  L1_S24_F1014 .
Loaded  L1_S24_F1016 .
Loaded  L1_S24_F1021 .
Loaded  L1_S24_F1026 .
Loaded  L1_S24_F1031 .
Loaded  L1_S24_F1036 .
Loaded  L1_S24_F1041 .
Loaded  L1_S24_F1046 .
Loaded  L1_S24_F1056 .
Loaded  L1_S24_F1068 .
Loaded  L1_S24_F1072 .
Loaded  L1_S24_F1079 .
Loaded  L1_S24_F1083 .
Loaded  L1_S24_F1087 .
Loaded  L1_S24_F1094 .
Loaded  L1_S24_F1098 .
Loaded  L1_S24_F1102 .
Loaded  L1_S24_F1106 .
Loaded  L1_S24_F1110 .
Loaded  L1_S24_F1118 .
Loaded  L1_S24_F1122 .
Loaded  L1_S24_F1126 .
Loaded  L1_S24_F1130 .
Loaded  L1_S24_F1134 .
Loaded  L1_S24_F1145 .
Loaded  L1_S24_F1148 .
Loaded  L1_S24_F1161 .
Loaded  L1_S24_F1166 .
Loaded  L1_S24_F1170 .
Loaded  L1_S24_F1172 .
Loaded  L1_S24_F1174 .
Loaded  L1_S24_F1176 .
Loaded  L1_S24_F1180 .
Loaded  L1_S24_F1184 .
Loaded  L1_S24_F1197 .
Loaded  L1_S24_F1202 .
Loaded  L1_S24_F1212 .
Loaded  L1_S24_F1225 .
Loaded  L1_S24_F1230 .
Loaded  L1_S24_F1235 .
Loaded  L1_S24_F1240 .
Loaded  L1_S24_F1245 .
Loaded  L1_S24_F1250 .
Loaded  L1_S24_F1255 .
Loaded  L1_S24_F1260 .
Loaded  L1_S24_F1265 .
Loaded  L1_S24_F1270 .
Loaded  L1_S24_F1275 .
Loaded  L1_S24_F1293 .
Loaded  L1_S24_F1303 .
Loaded  L1_S24_F1316 .
Loaded  L1_S24_F1321 .
Loaded  L1_S24_F1326 .
Loaded  L1_S24_F1331 .
Loaded  L1_S24_F1336 .
Loaded  L1_S24_F1341 .
Loaded  L1_S24_F1346 .
Loaded  L1_S24_F1351 .
Loaded  L1_S24_F1356 .
Loaded  L1_S24_F1361 .
Loaded  L1_S24_F1366 .
Loaded  L1_S24_F1371 .
Loaded  L1_S24_F1376 .
Loaded  L1_S24_F1381 .
Loaded  L1_S24_F1386 .
Loaded  L1_S24_F1391 .
Loaded  L1_S24_F1396 .
Loaded  L1_S24_F1401 .
Loaded  L1_S24_F1406 .
Loaded  L1_S24_F1411 .
Loaded  L1_S24_F1416 .
Loaded  L1_S24_F1421 .
Loaded  L1_S24_F1426 .
Loaded  L1_S24_F1431 .
Loaded  L1_S24_F1436 .
Loaded  L1_S24_F1441 .
Loaded  L1_S24_F1446 .
Loaded  L1_S24_F1451 .
Loaded  L1_S24_F1463 .
Loaded  L1_S24_F1467 .
Loaded  L1_S24_F1474 .
Loaded  L1_S24_F1478 .
Loaded  L1_S24_F1482 .
Loaded  L1_S24_F1490 .
Loaded  L1_S24_F1494 .
Loaded  L1_S24_F1498 .
Loaded  L1_S24_F1502 .
Loaded  L1_S24_F1506 .
Loaded  L1_S24_F1512 .
Loaded  L1_S24_F1514 .
Loaded  L1_S24_F1516 .
Loaded  L1_S24_F1518 .
Loaded  L1_S24_F1520 .
Loaded  L1_S24_F1539 .
Loaded  L1_S24_F1544 .
Loaded  L1_S24_F1565 .
Loaded  L1_S24_F1567 .
Loaded  L1_S24_F1569 .
Loaded  L1_S24_F1571 .
Loaded  L1_S24_F1573 .
Loaded  L1_S24_F1575 .
Loaded  L1_S24_F1578 .
Loaded  L1_S24_F1581 .
Loaded  L1_S24_F1594 .
Loaded  L1_S24_F1599 .
Loaded  L1_S24_F1604 .
Loaded  L1_S24_F1609 .
Loaded  L1_S24_F1622 .
Loaded  L1_S24_F1627 .
Loaded  L1_S24_F1632 .
Loaded  L1_S24_F1637 .
Loaded  L1_S24_F1642 .
Loaded  L1_S24_F1647 .
Loaded  L1_S24_F1652 .
Loaded  L1_S24_F1657 .
Loaded  L1_S24_F1662 .
Loaded  L1_S24_F1667 .
Loaded  L1_S24_F1672 .
Loaded  L1_S24_F1685 .
Loaded  L1_S24_F1690 .
Loaded  L1_S24_F1695 .
Loaded  L1_S24_F1700 .
Loaded  L1_S24_F1713 .
Loaded  L1_S24_F1718 .
Loaded  L1_S24_F1723 .
Loaded  L1_S24_F1728 .
Loaded  L1_S24_F1733 .
Loaded  L1_S24_F1738 .
Loaded  L1_S24_F1743 .
Loaded  L1_S24_F1748 .
Loaded  L1_S24_F1753 .
Loaded  L1_S24_F1758 .
Loaded  L1_S24_F1763 .
Loaded  L1_S24_F1768 .
Loaded  L1_S24_F1773 .
Loaded  L1_S24_F1778 .
Loaded  L1_S24_F1783 .
Loaded  L1_S24_F1788 .
Loaded  L1_S24_F1793 .
Loaded  L1_S24_F1798 .
Loaded  L1_S24_F1803 .
Loaded  L1_S24_F1808 .
Loaded  L1_S24_F1810 .
Loaded  L1_S24_F1812 .
Loaded  L1_S24_F1814 .
Loaded  L1_S24_F1816 .
Loaded  L1_S24_F1818 .
Loaded  L1_S24_F1820 .
Loaded  L1_S24_F1822 .
Loaded  L1_S24_F1824 .
Loaded  L1_S24_F1829 .
Loaded  L1_S24_F1831 .
Loaded  L1_S24_F1834 .
Loaded  L1_S24_F1836 .
Loaded  L1_S24_F1838 .
Loaded  L1_S24_F1842 .
Loaded  L1_S24_F1844 .
Loaded  L1_S24_F1846 .
Loaded  L1_S24_F1848 .
Loaded  L1_S24_F1850 .
Loaded  L1_S25_F1855 .
Loaded  L1_S25_F1858 .
Loaded  L1_S25_F1865 .
Loaded  L1_S25_F1869 .
Loaded  L1_S25_F1881 .
Loaded  L1_S25_F1885 .
Loaded  L1_S25_F1890 .
Loaded  L1_S25_F1892 .
Loaded  L1_S25_F1894 .
Loaded  L1_S25_F1896 .
Loaded  L1_S25_F1900 .
Loaded  L1_S25_F1909 .
Loaded  L1_S25_F1914 .
Loaded  L1_S25_F1919 .
Loaded  L1_S25_F1924 .
Loaded  L1_S25_F1929 .
Loaded  L1_S25_F1938 .
Loaded  L1_S25_F1943 .
Loaded  L1_S25_F1948 .
Loaded  L1_S25_F1953 .
Loaded  L1_S25_F1958 .
Loaded  L1_S25_F1963 .
Loaded  L1_S25_F1968 .
Loaded  L1_S25_F1973 .
Loaded  L1_S25_F1978 .
Loaded  L1_S25_F1987 .
Loaded  L1_S25_F1992 .
Loaded  L1_S25_F1997 .
Loaded  L1_S25_F2002 .
Loaded  L1_S25_F2007 .
Loaded  L1_S25_F2016 .
Loaded  L1_S25_F2021 .
Loaded  L1_S25_F2026 .
Loaded  L1_S25_F2031 .
Loaded  L1_S25_F2036 .
Loaded  L1_S25_F2046 .
Loaded  L1_S25_F2051 .
Loaded  L1_S25_F2056 .
Loaded  L1_S25_F2061 .
Loaded  L1_S25_F2066 .
Loaded  L1_S25_F2071 .
Loaded  L1_S25_F2076 .
Loaded  L1_S25_F2081 .
Loaded  L1_S25_F2086 .
Loaded  L1_S25_F2091 .
Loaded  L1_S25_F2096 .
Loaded  L1_S25_F2101 .
Loaded  L1_S25_F2106 .
Loaded  L1_S25_F2111 .
Loaded  L1_S25_F2116 .
Loaded  L1_S25_F2121 .
Loaded  L1_S25_F2126 .
Loaded  L1_S25_F2131 .
Loaded  L1_S25_F2136 .
Loaded  L1_S25_F2144 .
Loaded  L1_S25_F2147 .
Loaded  L1_S25_F2152 .
Loaded  L1_S25_F2155 .
Loaded  L1_S25_F2158 .
Loaded  L1_S25_F2161 .
Loaded  L1_S25_F2164 .
Loaded  L1_S25_F2167 .
Loaded  L1_S25_F2170 .
Loaded  L1_S25_F2173 .
Loaded  L1_S25_F2176 .
Loaded  L1_S25_F2193 .
Loaded  L1_S25_F2196 .
Loaded  L1_S25_F2199 .
Loaded  L1_S25_F2217 .
Loaded  L1_S25_F2220 .
Loaded  L1_S25_F2223 .
Loaded  L1_S25_F2231 .
Loaded  L1_S25_F2233 .
Loaded  L1_S25_F2237 .
Loaded  L1_S25_F2239 .
Loaded  L1_S25_F2241 .
Loaded  L1_S25_F2243 .
Loaded  L1_S25_F2245 .
Loaded  L1_S25_F2247 .
Loaded  L1_S25_F2249 .
Loaded  L1_S25_F2258 .
Loaded  L1_S25_F2263 .
Loaded  L1_S25_F2268 .
Loaded  L1_S25_F2273 .
Loaded  L1_S25_F2278 .
Loaded  L1_S25_F2287 .
Loaded  L1_S25_F2292 .
Loaded  L1_S25_F2297 .
Loaded  L1_S25_F2302 .
Loaded  L1_S25_F2307 .
Loaded  L1_S25_F2312 .
Loaded  L1_S25_F2317 .
Loaded  L1_S25_F2322 .
Loaded  L1_S25_F2327 .
Loaded  L1_S25_F2336 .
Loaded  L1_S25_F2341 .
Loaded  L1_S25_F2346 .
Loaded  L1_S25_F2351 .
Loaded  L1_S25_F2356 .
Loaded  L1_S25_F2365 .
Loaded  L1_S25_F2370 .
Loaded  L1_S25_F2375 .
Loaded  L1_S25_F2380 .
Loaded  L1_S25_F2385 .
Loaded  L1_S25_F2390 .
Loaded  L1_S25_F2395 .
Loaded  L1_S25_F2400 .
Loaded  L1_S25_F2405 .
Loaded  L1_S25_F2408 .
Loaded  L1_S25_F2411 .
Loaded  L1_S25_F2414 .
Loaded  L1_S25_F2417 .
Loaded  L1_S25_F2420 .
Loaded  L1_S25_F2423 .
Loaded  L1_S25_F2426 .
Loaded  L1_S25_F2429 .
Loaded  L1_S25_F2431 .
Loaded  L1_S25_F2433 .
Loaded  L1_S25_F2435 .
Loaded  L1_S25_F2437 .
Loaded  L1_S25_F2439 .
Loaded  L1_S25_F2441 .
Loaded  L1_S25_F2443 .
Loaded  L1_S25_F2449 .
Loaded  L1_S25_F2451 .
Loaded  L1_S25_F2454 .
Loaded  L1_S25_F2456 .
Loaded  L1_S25_F2458 .
Loaded  L1_S25_F2460 .
Loaded  L1_S25_F2462 .
Loaded  L1_S25_F2464 .
Loaded  L1_S25_F2466 .
Loaded  L1_S25_F2468 .
Loaded  L1_S25_F2484 .
Loaded  L1_S25_F2487 .
Loaded  L1_S25_F2490 .
Loaded  L1_S25_F2498 .
Loaded  L1_S25_F2500 .
Loaded  L1_S25_F2504 .
Loaded  L1_S25_F2506 .
Loaded  L1_S25_F2508 .
Loaded  L1_S25_F2514 .
Loaded  L1_S25_F2516 .
Loaded  L1_S25_F2525 .
Loaded  L1_S25_F2530 .
Loaded  L1_S25_F2535 .
Loaded  L1_S25_F2545 .
Loaded  L1_S25_F2554 .
Loaded  L1_S25_F2559 .
Loaded  L1_S25_F2564 .
Loaded  L1_S25_F2569 .
Loaded  L1_S25_F2574 .
Loaded  L1_S25_F2579 .
Loaded  L1_S25_F2584 .
Loaded  L1_S25_F2589 .
Loaded  L1_S25_F2594 .
Loaded  L1_S25_F2603 .
Loaded  L1_S25_F2608 .
Loaded  L1_S25_F2613 .
Loaded  L1_S25_F2623 .
Loaded  L1_S25_F2632 .
Loaded  L1_S25_F2637 .
Loaded  L1_S25_F2642 .
Loaded  L1_S25_F2647 .
Loaded  L1_S25_F2652 .
Loaded  L1_S25_F2657 .
Loaded  L1_S25_F2662 .
Loaded  L1_S25_F2667 .
Loaded  L1_S25_F2672 .
Loaded  L1_S25_F2677 .
Loaded  L1_S25_F2682 .
Loaded  L1_S25_F2687 .
Loaded  L1_S25_F2692 .
Loaded  L1_S25_F2697 .
Loaded  L1_S25_F2702 .
Loaded  L1_S25_F2707 .
Loaded  L1_S25_F2712 .
Loaded  L1_S25_F2714 .
Loaded  L1_S25_F2716 .
Loaded  L1_S25_F2718 .
Loaded  L1_S25_F2720 .
Loaded  L1_S25_F2722 .
Loaded  L1_S25_F2724 .
Loaded  L1_S25_F2726 .
Loaded  L1_S25_F2732 .
Loaded  L1_S25_F2734 .
Loaded  L1_S25_F2737 .
Loaded  L1_S25_F2739 .
Loaded  L1_S25_F2741 .
Loaded  L1_S25_F2743 .
Loaded  L1_S25_F2745 .
Loaded  L1_S25_F2747 .
Loaded  L1_S25_F2749 .
Loaded  L1_S25_F2751 .
Loaded  L1_S25_F2767 .
Loaded  L1_S25_F2770 .
Loaded  L1_S25_F2773 .
Loaded  L1_S25_F2781 .
Loaded  L1_S25_F2783 .
Loaded  L1_S25_F2787 .
Loaded  L1_S25_F2789 .
Loaded  L1_S25_F2791 .
Loaded  L1_S25_F2793 .
Loaded  L1_S25_F2795 .
Loaded  L1_S25_F2797 .
Loaded  L1_S25_F2799 .
Loaded  L1_S25_F2808 .
Loaded  L1_S25_F2813 .
Loaded  L1_S25_F2818 .
Loaded  L1_S25_F2823 .
Loaded  L1_S25_F2828 .
Loaded  L1_S25_F2837 .
Loaded  L1_S25_F2842 .
Loaded  L1_S25_F2847 .
Loaded  L1_S25_F2852 .
Loaded  L1_S25_F2867 .
Loaded  L1_S25_F2872 .
Loaded  L1_S25_F2877 .
Loaded  L1_S25_F2886 .
Loaded  L1_S25_F2891 .
Loaded  L1_S25_F2896 .
Loaded  L1_S25_F2901 .
Loaded  L1_S25_F2906 .
Loaded  L1_S25_F2915 .
Loaded  L1_S25_F2920 .
Loaded  L1_S25_F2925 .
Loaded  L1_S25_F2930 .
Loaded  L1_S25_F2935 .
Loaded  L1_S25_F2940 .
Loaded  L1_S25_F2945 .
Loaded  L1_S25_F2950 .
Loaded  L1_S25_F2955 .
Loaded  L1_S25_F2960 .
Loaded  L1_S25_F2965 .
Loaded  L1_S25_F2970 .
Loaded  L1_S25_F2975 .
Loaded  L1_S25_F2980 .
Loaded  L1_S25_F2985 .
Loaded  L1_S25_F2990 .
Loaded  L1_S25_F2995 .
Loaded  L1_S25_F2997 .
Loaded  L1_S25_F2999 .
Loaded  L1_S25_F3001 .
Loaded  L1_S25_F3003 .
Loaded  L1_S25_F3005 .
Loaded  L1_S25_F3007 .
Loaded  L1_S25_F3009 .
Loaded  L1_S25_F3015 .
Loaded  L1_S25_F3017 .
Loaded  L1_S25_F3020 .
Loaded  L1_S25_F3022 .
Loaded  L1_S25_F3024 .
Loaded  L1_S25_F3026 .
Loaded  L1_S25_F3028 .
Loaded  L1_S25_F3030 .
Loaded  L1_S25_F3032 .
Loaded  L1_S25_F3034 .
Loaded  L2_S26_F3036 .
Loaded  L2_S26_F3040 .
Loaded  L2_S26_F3047 .
Loaded  L2_S26_F3051 .
Loaded  L2_S26_F3055 .
Loaded  L2_S26_F3062 .
Loaded  L2_S26_F3069 .
Loaded  L2_S26_F3073 .
Loaded  L2_S26_F3077 .
Loaded  L2_S26_F3106 .
Loaded  L2_S26_F3113 .
Loaded  L2_S26_F3117 .
Loaded  L2_S26_F3121 .
Loaded  L2_S26_F3125 .
Loaded  L2_S27_F3129 .
Loaded  L2_S27_F3133 .
Loaded  L2_S27_F3140 .
Loaded  L2_S27_F3144 .
Loaded  L2_S27_F3148 .
Loaded  L2_S27_F3155 .
Loaded  L2_S27_F3162 .
Loaded  L2_S27_F3166 .
Loaded  L2_S27_F3170 .
Loaded  L2_S27_F3199 .
Loaded  L2_S27_F3206 .
Loaded  L2_S27_F3210 .
Loaded  L2_S27_F3214 .
Loaded  L2_S27_F3218 .
Loaded  L2_S28_F3222 .
Loaded  L2_S28_F3226 .
Loaded  L2_S28_F3233 .
Loaded  L2_S28_F3237 .
Loaded  L2_S28_F3241 .
Loaded  L2_S28_F3248 .
Loaded  L2_S28_F3255 .
Loaded  L2_S28_F3259 .
Loaded  L2_S28_F3263 .
Loaded  L2_S28_F3292 .
Loaded  L2_S28_F3299 .
Loaded  L2_S28_F3303 .
Loaded  L2_S28_F3307 .
Loaded  L2_S28_F3311 .
Loaded  L3_S29_F3315 .
Loaded  L3_S29_F3318 .
Loaded  L3_S29_F3321 .
Loaded  L3_S29_F3324 .
Loaded  L3_S29_F3327 .
Loaded  L3_S29_F3330 .
Loaded  L3_S29_F3333 .
Loaded  L3_S29_F3336 .
Loaded  L3_S29_F3339 .
Loaded  L3_S29_F3342 .
Loaded  L3_S29_F3345 .
Loaded  L3_S29_F3348 .
Loaded  L3_S29_F3351 .
Loaded  L3_S29_F3354 .
Loaded  L3_S29_F3357 .
Loaded  L3_S29_F3367 .
Loaded  L3_S29_F3370 .
Loaded  L3_S29_F3373 .
Loaded  L3_S29_F3376 .
Loaded  L3_S29_F3379 .
Loaded  L3_S29_F3382 .
Loaded  L3_S29_F3385 .
Loaded  L3_S29_F3388 .
Loaded  L3_S29_F3395 .
Loaded  L3_S29_F3401 .
Loaded  L3_S29_F3404 .
Loaded  L3_S29_F3407 .
Loaded  L3_S29_F3412 .
Loaded  L3_S29_F3421 .
Loaded  L3_S29_F3424 .
Loaded  L3_S29_F3427 .
Loaded  L3_S29_F3430 .
Loaded  L3_S29_F3433 .
Loaded  L3_S29_F3436 .
Loaded  L3_S29_F3439 .
Loaded  L3_S29_F3442 .
Loaded  L3_S29_F3449 .
Loaded  L3_S29_F3452 .
Loaded  L3_S29_F3455 .
Loaded  L3_S29_F3458 .
Loaded  L3_S29_F3461 .
Loaded  L3_S29_F3467 .
Loaded  L3_S29_F3473 .
Loaded  L3_S29_F3476 .
Loaded  L3_S29_F3479 .
Loaded  L3_S29_F3482 .
Loaded  L3_S29_F3485 .
Loaded  L3_S29_F3488 .
Loaded  L3_S29_F3491 .
Loaded  L3_S30_F3494 .
Loaded  L3_S30_F3499 .
Loaded  L3_S30_F3504 .
Loaded  L3_S30_F3514 .
Loaded  L3_S30_F3519 .
Loaded  L3_S30_F3524 .
Loaded  L3_S30_F3529 .
Loaded  L3_S30_F3534 .
Loaded  L3_S30_F3539 .
Loaded  L3_S30_F3544 .
Loaded  L3_S30_F3549 .
Loaded  L3_S30_F3554 .
Loaded  L3_S30_F3559 .
Loaded  L3_S30_F3564 .
Loaded  L3_S30_F3569 .
Loaded  L3_S30_F3574 .
Loaded  L3_S30_F3579 .
Loaded  L3_S30_F3584 .
Loaded  L3_S30_F3589 .
Loaded  L3_S30_F3604 .
Loaded  L3_S30_F3609 .
Loaded  L3_S30_F3624 .
Loaded  L3_S30_F3629 .
Loaded  L3_S30_F3634 .
Loaded  L3_S30_F3639 .
Loaded  L3_S30_F3644 .
Loaded  L3_S30_F3649 .
Loaded  L3_S30_F3664 .
Loaded  L3_S30_F3669 .
Loaded  L3_S30_F3674 .
Loaded  L3_S30_F3679 .
Loaded  L3_S30_F3684 .
Loaded  L3_S30_F3689 .
Loaded  L3_S30_F3704 .
Loaded  L3_S30_F3709 .
Loaded  L3_S30_F3724 .
Loaded  L3_S30_F3729 .
Loaded  L3_S30_F3734 .
Loaded  L3_S30_F3739 .
Loaded  L3_S30_F3744 .
Loaded  L3_S30_F3749 .
Loaded  L3_S30_F3754 .
Loaded  L3_S30_F3759 .
Loaded  L3_S30_F3764 .
Loaded  L3_S30_F3769 .
Loaded  L3_S30_F3774 .
Loaded  L3_S30_F3784 .
Loaded  L3_S30_F3794 .
Loaded  L3_S30_F3799 .
Loaded  L3_S30_F3804 .
Loaded  L3_S30_F3809 .
Loaded  L3_S30_F3819 .
Loaded  L3_S30_F3829 .
Loaded  L3_S31_F3834 .
Loaded  L3_S31_F3846 .
Loaded  L3_S32_F3850 .
Loaded  L3_S33_F3855 .
Loaded  L3_S33_F3857 .
Loaded  L3_S33_F3859 .
Loaded  L3_S33_F3861 .
Loaded  L3_S33_F3863 .
Loaded  L3_S33_F3865 .
Loaded  L3_S33_F3867 .
Loaded  L3_S33_F3869 .
Loaded  L3_S33_F3871 .
Loaded  L3_S33_F3873 .
Loaded  L3_S34_F3876 .
Loaded  L3_S34_F3878 .
Loaded  L3_S34_F3880 .
Loaded  L3_S34_F3882 .
Loaded  L3_S35_F3889 .
Loaded  L3_S35_F3896 .
Loaded  L3_S35_F3898 .
Loaded  L3_S35_F3903 .
Loaded  L3_S35_F3908 .
Loaded  L3_S35_F3913 .
Loaded  L3_S36_F3920 .
Loaded  L3_S36_F3924 .
Loaded  L3_S36_F3926 .
Loaded  L3_S36_F3930 .
Loaded  L3_S36_F3934 .
Loaded  L3_S36_F3938 .
Loaded  L3_S37_F3944 .
Loaded  L3_S37_F3946 .
Loaded  L3_S37_F3948 .
Loaded  L3_S37_F3950 .
Loaded  L3_S38_F3956 .
Loaded  L3_S38_F3960 .
Loaded  L3_S39_F3964 .
Loaded  L3_S39_F3972 .
Loaded  L3_S39_F3976 .
Loaded  L3_S40_F3980 .
Loaded  L3_S40_F3982 .
Loaded  L3_S40_F3984 .
Loaded  L3_S40_F3986 .
Loaded  L3_S40_F3992 .
Loaded  L3_S40_F3994 .
Loaded  L3_S41_F3998 .
Loaded  L3_S41_F4000 .
Loaded  L3_S41_F4002 .
Loaded  L3_S41_F4004 .
Loaded  L3_S41_F4006 .
Loaded  L3_S41_F4008 .
Loaded  L3_S41_F4011 .
Loaded  L3_S41_F4014 .
Loaded  L3_S41_F4016 .
Loaded  L3_S41_F4018 .
Loaded  L3_S41_F4020 .
Loaded  L3_S41_F4023 .
Loaded  L3_S41_F4026 .
Loaded  L3_S43_F4065 .
Loaded  L3_S43_F4070 .
Loaded  L3_S43_F4075 .
Loaded  L3_S43_F4080 .
Loaded  L3_S43_F4085 .
Loaded  L3_S43_F4090 .
Loaded  L3_S43_F4095 .
Loaded  L3_S44_F4106 .
Loaded  L3_S44_F4109 .
Loaded  L3_S44_F4112 .
Loaded  L3_S44_F4115 .
Loaded  L3_S44_F4118 .
Loaded  L3_S44_F4121 .
Loaded  L3_S45_F4124 .
Loaded  L3_S45_F4128 .
Loaded  L3_S45_F4130 .
Loaded  L3_S45_F4132 .
Loaded  L3_S47_F4138 .
Loaded  L3_S47_F4143 .
Loaded  L3_S47_F4148 .
Loaded  L3_S47_F4153 .
Loaded  L3_S47_F4158 .
Loaded  L3_S47_F4163 .
Loaded  L3_S47_F4168 .
Loaded  L3_S47_F4178 .
Loaded  L3_S47_F4183 .
Loaded  L3_S47_F4188 .
Loaded  L3_S48_F4196 .
Loaded  L3_S48_F4198 .
Loaded  L3_S48_F4200 .
Loaded  L3_S48_F4202 .
Loaded  L3_S48_F4204 .
Loaded  L3_S49_F4211 .
Loaded  L3_S49_F4221 .
Loaded  L3_S49_F4226 .
Loaded  L3_S49_F4231 .
Loaded  L3_S50_F4243 .
Loaded  L3_S50_F4249 .
Loaded  L3_S50_F4251 .
Loaded  L3_S51_F4260 .
Loaded  L3_S51_F4262 .
#saveRDS(data, "Laurae/NumericCMI_exact_best_grid/Train_features.rds")
#saveRDS(target, "E:/Laurae/NumericCMI_exact_best_grid/Train_target.rds")

Information Gain

Prepare frame

Dictionary:

  • Numeric: 847 features (Raw)
  • Time-Series: 847 features (TS)
ig_frame <- data.frame(matrix(nrow = 847, ncol = 5))
colnames(ig_frame) <- c("Feature", "Levels", "NotMissing", "IV_Raw", "IV_TS")
ig_frame$Feature <- colnames(numeric)[1:847]
all_frame <- fread("E:/Laurae/NumericCMI_exact_best_grid/IG_2216feat.csv", data.table = FALSE)
ig_frame <- merge(ig_frame, all_frame, by = "Feature", all.x = TRUE, sort = FALSE)
ig_frame <- ig_frame[, c("Feature", "Levels.y", "NotMissing.y", "IV_Raw", "IV_TS")]
colnames(ig_frame) <- c("Feature", "Levels", "NotMissing", "IV_Raw", "IV_TS")

Prepare speed optimizations

cores <- 6
choose <- cores * 5 # 5 times per core per batch
mcl <- makeCluster(cores)
invisible(clusterEvalQ(mcl, library("woe")))
invisible(clusterEvalQ(mcl, library("data.table")))
invisible(clusterEvalQ(mcl, library("rpart")))
registerDoParallel(cl = mcl)
# Magic function to coerce super quickly
setDF <- function(x) {
  if (!is.data.table(x))
    stop("x must be a data.table")
  setattr(x, "row.names", .set_row_names(nrow(x)))
  setattr(x, "class", "data.frame")
  setattr(x, "sorted", NULL)
  setattr(x, ".internal.selfref", NULL)
}

Precompute all Information Values

# Optimized for maximum speed
gc(verbose = TRUE)
Garbage collection 108 = 51+12+45 (level 2) ... 
95.6 Mbytes of cons cells used (56%)
15320.9 Mbytes of vectors used (62%)
             used    (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells    1789626    95.6    3205452   171.2    3205452   171.2
Vcells 2008133165 15320.9 3255312930 24836.1 2260479265 17246.1
StartTime <- System$currentTimeMillis()
cat("Information Value (Raw) Job started on ", format(Sys.time(), "%a %b %d %Y %X"), ".  \n", sep = "")
Information Value (Raw) Job started on Mon Oct 17 2016 12:08:38 AM.  
pb <- winProgressBar(title = "Information Value (Raw) computation", label = paste("[", format(Sys.time(), "%a %b %d %Y %X"), "] Preparing computation...", sep = ""), min = 0, max = 847, initial = 0, width = 520)
# Do loop
for (i in 1:ceiling(847 / choose)) {
  
  # Prepare parallel loop
  mini_temp <- numeric[, ((i - 1) * choose + 1):min((i * choose), 847), with = FALSE]
  mini_temp$target <- target
  setDF(mini_temp)
  clusterExport(mcl, c("mini_temp"))
  
  # Parallel loop setup
  ig_frame$IV_Raw[((i - 1) * choose + 1):min((i * choose), 847)] <- foreach(j = 1:((min((i * choose), 847) - ((i - 1) * choose + 1)) + 1), .combine = "c", .inorder = TRUE, .noexport = "mini_temp") %dopar% {
    set.seed(11111)
    whatever <- iv.mult(df = mini_temp,
                        y = "target",
                        vars = colnames(mini_temp)[j],
                        sql = FALSE,
                        topbin = TRUE,
                        tbpct = 0.0001,
                        verbose = FALSE,
                        rcontrol = rpart.control(minsplit = 100, cp = 0.00001, xval = 5))
    return(ifelse(length(whatever) == 0, 0, sum(whatever[[1]]$miv, na.rm = TRUE)))
  }
  invisible(clusterEvalQ(mcl, gc(verbose = FALSE)))
  
  # Harvest statistics
  cat("Batch ", i, ": mean IV = ", mean(ig_frame$IV_Raw[((i - 1) * choose + 1):min((i * choose), 847)]), "  \n", sep = "")
  CurrentTime <- System$currentTimeMillis()
  
  if (i < ceiling(847 / choose)) {
    
    ETA <- ifelse(i == ceiling(847 / choose), 0, (((847 / choose) - i) * (CurrentTime - StartTime) / i / 1000))
    pb_title <- paste("Information Value (Raw) computation [CPU=", sprintf("%07.2f", (CurrentTime - StartTime) / 1000), "s | ETA=", sprintf("%07.2f", ETA), "s]", sep = "")
    pb_iter <- ((CurrentTime - StartTime) / 1000) / (i * choose)
    setWinProgressBar(pb, value = i * choose, title = pb_title, label = paste("[", format(Sys.time(), "%X"), " | ", sprintf("%04.2f", pb_iter), " s/iter] Doing feature ", colnames(numeric)[i * choose], " (", sprintf("%04d", i * choose), " / 2216 = ", sprintf("%05.2f", 100 * (i * choose) / 847), "%)...", sep = ""))
  
  }
  
}
Batch 1: mean IV = 0.0260151  
Batch 2: mean IV = 0.01882139  
Batch 3: mean IV = 0.02608131  
Batch 4: mean IV = 0.02133668  
Batch 5: mean IV = 0.01235418  
Batch 6: mean IV = 0.001723332  
Batch 7: mean IV = 0.002133675  
Batch 8: mean IV = 0.003542311  
Batch 9: mean IV = 0.002831129  
Batch 10: mean IV = 0.03711379  
Batch 11: mean IV = 0.03486352  
Batch 12: mean IV = 0.04003867  
Batch 13: mean IV = 0.004349045  
Batch 14: mean IV = 0.007304956  
Batch 15: mean IV = 0.0005045246  
Batch 16: mean IV = 0.0003688799  
Batch 17: mean IV = 5.365315e-05  
Batch 18: mean IV = 1.743335e-06  
Batch 19: mean IV = 0.0008791858  
Batch 20: mean IV = 0.0006374219  
Batch 21: mean IV = 0.03552357  
Batch 22: mean IV = 0.04726587  
Batch 23: mean IV = 0.09383893  
Batch 24: mean IV = 0.01609851  
Batch 25: mean IV = 0.01982167  
Batch 26: mean IV = 0.09125971  
Batch 27: mean IV = 0.007076523  
Batch 28: mean IV = 0.005951134  
Batch 29: mean IV = 0.001055506  
invisible(close(pb))
cat("Information Value (Raw) Computation time: ", sprintf("%07.2f", (System$currentTimeMillis() - StartTime) / 1000), "s.  \n", sep = "")
Information Value (Raw) Computation time: 2372.89s.  
cat("Information Value (Raw) Job over on ", format(Sys.time(), "%a %b %d %Y %X"), ".  \n", sep = "")
Information Value (Raw) Job over on Mon Oct 17 2016 12:48:11 AM.  
# Optimized for maximum speed
gc(verbose = TRUE)
Garbage collection 122 = 61+12+49 (level 2) ... 
102.5 Mbytes of cons cells used (60%)
15602.6 Mbytes of vectors used (63%)
             used    (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells    1919235   102.5    3205452   171.2    3205452   171.2
Vcells 2045058987 15602.6 3255312930 24836.1 3052366883 23287.8
StartTime <- System$currentTimeMillis()
cat("Information Value (TS) Job started on ", format(Sys.time(), "%a %b %d %Y %X"), ".  \n", sep = "")
Information Value (TS) Job started on Mon Oct 17 2016 01:23:16 AM.  
pb <- winProgressBar(title = "Information Value (TS) computation", label = paste("[", format(Sys.time(), "%a %b %d %Y %X"), "] Preparing computation...", sep = ""), min = 0, max = 847, initial = 0, width = 520)
# Do loop
for (i in 1:ceiling(847 / choose)) {
  
  # Prepare parallel loop
  mini_temp <- numeric[, (847 + ((i - 1) * choose + 1)):(847 + min((i * choose), 847)), with = FALSE]
  mini_temp$target <- target
  setDF(mini_temp)
  clusterExport(mcl, c("mini_temp"))
  
  # Parallel loop setup
  ig_frame$IV_TS[((i - 1) * choose + 1):min((i * choose), 847)] <- foreach(j = 1:((min((i * choose), 847) - ((i - 1) * choose + 1)) + 1), .combine = "c", .inorder = TRUE, .noexport = "mini_temp") %dopar% {
    set.seed(11111)
    whatever <- iv.mult(df = mini_temp,
                        y = "target",
                        vars = colnames(mini_temp)[j],
                        sql = FALSE,
                        topbin = TRUE,
                        tbpct = 0.0001,
                        verbose = FALSE,
                        rcontrol = rpart.control(minsplit = 100, cp = 0.00001, xval = 5))
    return(ifelse(length(whatever) == 0, 0, sum(whatever[[1]]$miv, na.rm = TRUE)))
  }
  invisible(clusterEvalQ(mcl, gc(verbose = FALSE)))
  
  # Harvest statistics
  cat("Batch ", i, ": mean IV = ", mean(ig_frame$IV_TS[((i - 1) * choose + 1):min((i * choose), 847)]), "  \n", sep = "")
  CurrentTime <- System$currentTimeMillis()
  
  if (i < ceiling(847 / choose)) {
    
    ETA <- ifelse(i == ceiling(847 / choose), 0, (((847 / choose) - i) * (CurrentTime - StartTime) / i / 1000))
    pb_title <- paste("Information Value (TS) computation [CPU=", sprintf("%07.2f", (CurrentTime - StartTime) / 1000), "s | ETA=", sprintf("%07.2f", ETA), "s]", sep = "")
    pb_iter <- ((CurrentTime - StartTime) / 1000) / (i * choose)
    setWinProgressBar(pb, value = i * choose, title = pb_title, label = paste("[", format(Sys.time(), "%X"), " | ", sprintf("%04.2f", pb_iter), " s/iter] Doing feature ", colnames(numeric)[i * choose], " (", sprintf("%04d", i * choose), " / 847 = ", sprintf("%05.2f", 100 * (i * choose) / 847), "%)...", sep = ""))
  
  }
  
}
Batch 1: mean IV = 0.01582562  
Batch 2: mean IV = 0.01209923  
Batch 3: mean IV = 0.008088839  
Batch 4: mean IV = 0.01302411  
Batch 5: mean IV = 0.01074356  
Batch 6: mean IV = 0.003403406  
Batch 7: mean IV = 0.003527316  
Batch 8: mean IV = 0.005118777  
Batch 9: mean IV = 0.00337424  
Batch 10: mean IV = 0.03309113  
Batch 11: mean IV = 0.1269662  
Batch 12: mean IV = 0.1041677  
Batch 13: mean IV = 0.005665669  
Batch 14: mean IV = 0.006770514  
Batch 15: mean IV = 0.001296637  
Batch 16: mean IV = 0.001698381  
Batch 17: mean IV = 0.0004207886  
Batch 18: mean IV = 0.0006988822  
Batch 19: mean IV = 0.0009079932  
Batch 20: mean IV = 0.001300575  
Batch 21: mean IV = 0.09758265  
Batch 22: mean IV = 0.04890238  
Batch 23: mean IV = 0.08834347  
Batch 24: mean IV = 0.0114363  
Batch 25: mean IV = 0.009829268  
Batch 26: mean IV = 0.09226964  
Batch 27: mean IV = 0.006198878  
Batch 28: mean IV = 0.01006495  
Batch 29: mean IV = 0.0009639902  
invisible(close(pb))
cat("Information Value (TS) Computation time: ", sprintf("%07.2f", (System$currentTimeMillis() - StartTime) / 1000), "s.  \n", sep = "")
Information Value (TS) Computation time: 2495.42s.  
cat("Information Value (TS) Job over on ", format(Sys.time(), "%a %b %d %Y %X"), ".  \n", sep = "")
Information Value (TS) Job over on Mon Oct 17 2016 02:04:51 AM.  

Kill multithreading

registerDoSEQ()
stopCluster(mcl)
closeAllConnections()

Setup feature names properly

all_frame <- ig_frame
all_frame$RankIV_Raw <- (nrow(all_frame) + 1) - rank(all_frame$IV_Raw, ties.method = "max")
all_frame$RankIV_TS <- (nrow(all_frame) + 1) - rank(all_frame$IV_TS, ties.method = "max")
all_frame$TSvsRaw <- rep("", nrow(all_frame))
all_frame$TSvsRaw[all_frame$IV_Raw > all_frame$IV_TS] <- "Raw"
all_frame$TSvsRaw[all_frame$IV_Raw < all_frame$IV_TS] <- "TS"
all_frame$TSvsRaw[all_frame$IV_Raw == all_frame$IV_TS] <- "None"
all_frame$TSvsRaw <- as.factor(all_frame$TSvsRaw)
gc(verbose = TRUE)
Garbage collection 140 = 71+13+56 (level 2) ... 
106.2 Mbytes of cons cells used (62%)
15395.8 Mbytes of vectors used (62%)
             used    (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells    1987393   106.2    3205452   171.2    3205452   171.2
Vcells 2017951504 15395.8 3255312930 24836.1 3052366883 23287.8
fwrite(all_frame, "E:/Laurae/NumericCMI_exact_best_grid/IV_TSfeat.csv")

What is better

Summary :

  • There are 356 features having higher Information Value using the stationary time-series blender. The increase can reach up to 1.5390692.
  • There are 384 features having lower Information Value using the stationary time-series blender.
  • There are 107 features having no change using the stationary time-series blender.

Pretty print DT Information Value

datatable(all_frame,
          filter = "top",
          class = "cell-border stripe",
          plugins = "natural",
          extensions = c("AutoFill",
                         #"Buttons",
                         "ColReorder",
                         "KeyTable",
                         "Responsive",
                         "RowReorder"),
          options = list(style = "bootstrap",
                         pageLength = 20,
                         lengthMenu = c(5, 10, 15, 20, 25, 50, 100, 250, 500, 1000),
                         order = list(list(5, "desc")),
                         autofill = TRUE,
                         #dom = "Bfrtip",
                         #buttons = c("copy", "csv", "excel", "pdf", "print"),
                         colReorder = TRUE,
                         keys = TRUE,
                         rowReorder = TRUE,
                         searchHighlight = TRUE,
                         search = list(regex = TRUE, caseInsensitive = FALSE))
          ) %>% formatStyle('IV_Raw',
                             background = styleColorBar(range(all_frame$IV_Raw, na.rm = TRUE, finite = TRUE), 'lightgreen'),
                             backgroundSize = '100% 90%',
                             backgroundRepeat = 'no-repeat',
                             backgroundPosition = 'center') %>%
                formatStyle('IV_TS',
                             background = styleColorBar(range(all_frame$IV_TS, na.rm = TRUE, finite = TRUE), 'pink'),
                             backgroundSize = '100% 90%',
                             backgroundRepeat = 'no-repeat',
                             backgroundPosition = 'center') %>%
                formatStyle('NotMissing',
                             background = styleColorBar(c(0, 1), 'lightgrey'),
                             backgroundSize = '100% 90%',
                             backgroundRepeat = 'no-repeat',
                             backgroundPosition = 'center') %>%
                formatStyle('Levels',
                             background = styleColorBar(range(all_frame$Levels, na.rm = TRUE, finite = TRUE), 'lightgrey'),
                             backgroundSize = '100% 90%',
                             backgroundRepeat = 'no-repeat',
                             backgroundPosition = 'center') %>%
                formatRound(columns = c("IV_Raw"),
                            digits = 8) %>%
                formatRound(columns = c("IV_TS"),
                            digits = 8) %>%
                formatPercentage(columns = c("NotMissing"),
                                 digits = 4)
plotting <- ggplot(all_frame, aes(x = IV_Raw, y = IV_TS, color = RankIV_Raw, color2 = RankIV_TS)) + labs(title = "IV Time-Series vs IV Raw Data, Rank Multivariate", x = "Information Value (Raw Data)", y = "Information Value (Time-Series)") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "IV Rank (Raw Data)", axis_title_y = "IV Rank (Time-Series)") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)

plotting <- ggplot(all_frame, aes(x = RankIV_Raw, y = RankIV_TS, color = IV_Raw, color2 = IV_TS)) + labs(title = "IV Rank Time-Series vs IV Rank Raw Data, Rank Multivariate", x = "Information Value Rank (Raw Data)", y = "Information Value Rank (Time-Series)") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "IV (Raw Data)", axis_title_y = "IV (Time-Series)") + scale_x_reverse(lim = rev(range(all_frame$RankIV_Raw))) + scale_y_reverse(lim = rev(range(all_frame$RankIV_TS))) + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)

plotting <- ggplot(all_frame, aes(x = IV_Raw, y = IV_TS, color = Levels, color2 = NotMissing)) + labs(title = "IV Time-Series vs IV Raw Data, Levels/Not-missing Multivariate", x = "Information Value (Raw Data)", y = "Information Value (Time-Series)") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "Levels", axis_title_y = "Not-missing") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)

plotting <- ggplot(all_frame, aes(x = RankIV_Raw, y = RankIV_TS, color = Levels, color2 = NotMissing)) + labs(title = "IV Rank Time-Series vs IV Rank Raw Data, Levels/Not-missing Multivariate", x = "Information Value Rank (Raw Data)", y = "Information Value Rank (Time-Series)") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "Levels", axis_title_y = "Not-missing") + scale_x_reverse(lim = rev(range(all_frame$RankIV_Raw))) + scale_y_reverse(lim = rev(range(all_frame$RankIV_TS))) + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)

plotting <- ggplot(all_frame, aes(x = Levels, y = NotMissing, color = IV_Raw, color2 = IV_TS)) + labs(title = "Not-missing vs Levels, IV Time-Series / Raw Data Multivariate", x = "Levels", y = "Not-missing") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "IV (Raw Data)", axis_title_y = "IV (Time-Series)") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)

plotting <- ggplot(all_frame, aes(x = Levels, y = NotMissing, color = RankIV_Raw, color2 = RankIV_TS)) + labs(title = "Not-missing vs Levels, IV Rank Time-Series / Raw Data Multivariate", x = "Levels", y = "Not-missing") + theme_bw() + geom_rug() + scale_color_colorplane(axis_title = "IV Rank (Raw Data)", axis_title_y = "IV Rank (Time-Series)") + theme(plot.title = element_text(size = rel(2), face = "bold"), axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(2)), axis.text.x = element_text(size = rel(2)), axis.text.y = element_text(size = rel(2))) + geom_point_interactive(aes(tooltip = Feature), size = 2)
ggiraph(code = print(plotting), width_svg = 18, height_svg = 14, zoom_max = 5)
LS0tDQp0aXRsZTogIk51bWVyaWMgKFRpbWUgU2VyaWVzKSBJbmZvcm1hdGlvbiBWYWx1ZSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjc3M6IGRpc2NyZXRpemF0aW9uLmNzcw0KLS0tDQoNCiMgUHJlbG9hZA0KDQpQcmVsb2FkIHRoaW5ncy4NCg0KYGBge3J9DQoNCiMgUHJlcGFyZSBzdHVmZg0Kc2V0d2QoIkU6LyIpDQpsaWJyYXJ5KHJlY29tbWVuZGVybGFiKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShpbmZvdGhlbykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KFIudXRpbHMpDQpsaWJyYXJ5KGRvUGFyYWxsZWwpDQpsaWJyYXJ5KGZvcmVhY2gpDQpsaWJyYXJ5KHJwYXJ0KQ0KbGlicmFyeSh3b2UpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNvbG9ycGxhbmVyKQ0KbGlicmFyeShnZ2lyYXBoKQ0KbGlicmFyeShncmlkRXh0cmEpDQoNCiMgTG9hZCBkYXRhDQpudW1lcmljIDwtIHJlYWRSRFMoImRhdGFzZXRzL3RyYWluX251bWVyaWMucmRzIikNCmdjKHZlcmJvc2UgPSBUUlVFKQ0KDQojIFByZXBhcmUgZGF0YQ0KdGFyZ2V0IDwtIG51bWVyaWMkUmVzcG9uc2UNCmdjKHZlcmJvc2UgPSBUUlVFKQ0KZmVhdHVyZV9uYW1lcyA8LSBmcmVhZCgiTGF1cmFlL2RhdGVfZmVhdF9sdXRfVjIudHh0IiwgaGVhZGVyID0gVFJVRSkNCmZlYXR1cmVfbmFtZXMgPC0gZmVhdHVyZV9uYW1lc1shbmFtZV9udW0gPT0gIiIsIF0NCmZlYXR1cmVfbmFtZXMgPC0gZmVhdHVyZV9uYW1lc1ssIGMoIm5hbWVfbnVtIiwgInN0YXRpb25fVjIiLCAibGluZSIsICJzdGF0aW9uIiwgImZlYXR1cmVfbnIiKSwgd2l0aCA9IEZBTFNFXQ0KY29sbmFtZXMoZmVhdHVyZV9uYW1lcykgPC0gYygiRmVhdHVyZSIsICJTdGF0aW9uIiwgIkxpbmUiLCAiT3JpZ19TdCIsICJGZWF0X05iIikNCmdjKHZlcmJvc2UgPSBUUlVFKQ0KDQp1c2VkX2NvbHVtbnMgPC0gZnJlYWQoIkU6L0xhdXJhZS9UaW1lU2VyaWVzL3VzZWRfY29sdW1ucy5jc3YiKSR4DQoNCm51bWVyaWMgPC0gbnVtZXJpY1ssIHVzZWRfY29sdW1ucywgd2l0aCA9IEZBTFNFXQ0KZ2ModmVyYm9zZSA9IFRSVUUpDQoNCmZvciAoaSBpbiB1c2VkX2NvbHVtbnMpIHsNCiAgaiA8LSBwYXN0ZShpLCAiX3Jlc2lkdWFscyIsIHNlcCA9ICIiKQ0KICBudW1lcmljWywgKGopIDo9IGZyZWFkKHBhc3RlKCJFOi9MYXVyYWUvVGltZVNlcmllcy8iLCBpLCAiX1RTLmNzdiIsIHNlcCA9ICIiKSwgaGVhZGVyID0gVFJVRSwgc2VsZWN0ID0gMiwgc2hvd1Byb2dyZXNzID0gRkFMU0UpJFJlc2lkdWFsc1sxOjExODM3NDddXQ0KICBjYXQoIkxvYWRlZCAiLCBpLCAiLlxuIikNCn0NCiNzYXZlUkRTKGRhdGEsICJMYXVyYWUvTnVtZXJpY0NNSV9leGFjdF9iZXN0X2dyaWQvVHJhaW5fZmVhdHVyZXMucmRzIikNCiNzYXZlUkRTKHRhcmdldCwgIkU6L0xhdXJhZS9OdW1lcmljQ01JX2V4YWN0X2Jlc3RfZ3JpZC9UcmFpbl90YXJnZXQucmRzIikNCmBgYA0KDQojIEluZm9ybWF0aW9uIEdhaW4NCg0KIyMgUHJlcGFyZSBmcmFtZQ0KDQpEaWN0aW9uYXJ5Og0KDQoqIE51bWVyaWM6IDg0NyBmZWF0dXJlcyAoUmF3KQ0KKiBUaW1lLVNlcmllczogODQ3IGZlYXR1cmVzIChUUykNCg0KYGBge3J9DQppZ19mcmFtZSA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gODQ3LCBuY29sID0gNSkpDQpjb2xuYW1lcyhpZ19mcmFtZSkgPC0gYygiRmVhdHVyZSIsICJMZXZlbHMiLCAiTm90TWlzc2luZyIsICJJVl9SYXciLCAiSVZfVFMiKQ0KaWdfZnJhbWUkRmVhdHVyZSA8LSBjb2xuYW1lcyhudW1lcmljKVsxOjg0N10NCmBgYA0KDQpgYGB7cn0NCmFsbF9mcmFtZSA8LSBmcmVhZCgiRTovTGF1cmFlL051bWVyaWNDTUlfZXhhY3RfYmVzdF9ncmlkL0lHXzIyMTZmZWF0LmNzdiIsIGRhdGEudGFibGUgPSBGQUxTRSkNCmlnX2ZyYW1lIDwtIG1lcmdlKGlnX2ZyYW1lLCBhbGxfZnJhbWUsIGJ5ID0gIkZlYXR1cmUiLCBhbGwueCA9IFRSVUUsIHNvcnQgPSBGQUxTRSkNCmlnX2ZyYW1lIDwtIGlnX2ZyYW1lWywgYygiRmVhdHVyZSIsICJMZXZlbHMueSIsICJOb3RNaXNzaW5nLnkiLCAiSVZfUmF3IiwgIklWX1RTIildDQpjb2xuYW1lcyhpZ19mcmFtZSkgPC0gYygiRmVhdHVyZSIsICJMZXZlbHMiLCAiTm90TWlzc2luZyIsICJJVl9SYXciLCAiSVZfVFMiKQ0KYGBgDQoNCiMjIFByZXBhcmUgc3BlZWQgb3B0aW1pemF0aW9ucw0KDQpgYGB7cn0NCg0KY29yZXMgPC0gNg0KY2hvb3NlIDwtIGNvcmVzICogNSAjIDUgdGltZXMgcGVyIGNvcmUgcGVyIGJhdGNoDQoNCm1jbCA8LSBtYWtlQ2x1c3Rlcihjb3JlcykNCmludmlzaWJsZShjbHVzdGVyRXZhbFEobWNsLCBsaWJyYXJ5KCJ3b2UiKSkpDQppbnZpc2libGUoY2x1c3RlckV2YWxRKG1jbCwgbGlicmFyeSgiZGF0YS50YWJsZSIpKSkNCmludmlzaWJsZShjbHVzdGVyRXZhbFEobWNsLCBsaWJyYXJ5KCJycGFydCIpKSkNCnJlZ2lzdGVyRG9QYXJhbGxlbChjbCA9IG1jbCkNCg0KIyBNYWdpYyBmdW5jdGlvbiB0byBjb2VyY2Ugc3VwZXIgcXVpY2tseQ0Kc2V0REYgPC0gZnVuY3Rpb24oeCkgew0KICBpZiAoIWlzLmRhdGEudGFibGUoeCkpDQogICAgc3RvcCgieCBtdXN0IGJlIGEgZGF0YS50YWJsZSIpDQogIHNldGF0dHIoeCwgInJvdy5uYW1lcyIsIC5zZXRfcm93X25hbWVzKG5yb3coeCkpKQ0KICBzZXRhdHRyKHgsICJjbGFzcyIsICJkYXRhLmZyYW1lIikNCiAgc2V0YXR0cih4LCAic29ydGVkIiwgTlVMTCkNCiAgc2V0YXR0cih4LCAiLmludGVybmFsLnNlbGZyZWYiLCBOVUxMKQ0KfQ0KYGBgDQoNCiMjIFByZWNvbXB1dGUgYWxsIEluZm9ybWF0aW9uIFZhbHVlcw0KDQpgYGB7cn0NCiMgT3B0aW1pemVkIGZvciBtYXhpbXVtIHNwZWVkDQoNCmdjKHZlcmJvc2UgPSBUUlVFKQ0KDQpTdGFydFRpbWUgPC0gU3lzdGVtJGN1cnJlbnRUaW1lTWlsbGlzKCkNCmNhdCgiSW5mb3JtYXRpb24gVmFsdWUgKFJhdykgSm9iIHN0YXJ0ZWQgb24gIiwgZm9ybWF0KFN5cy50aW1lKCksICIlYSAlYiAlZCAlWSAlWCIpLCAiLiAgXG4iLCBzZXAgPSAiIikNCnBiIDwtIHdpblByb2dyZXNzQmFyKHRpdGxlID0gIkluZm9ybWF0aW9uIFZhbHVlIChSYXcpIGNvbXB1dGF0aW9uIiwgbGFiZWwgPSBwYXN0ZSgiWyIsIGZvcm1hdChTeXMudGltZSgpLCAiJWEgJWIgJWQgJVkgJVgiKSwgIl0gUHJlcGFyaW5nIGNvbXB1dGF0aW9uLi4uIiwgc2VwID0gIiIpLCBtaW4gPSAwLCBtYXggPSA4NDcsIGluaXRpYWwgPSAwLCB3aWR0aCA9IDUyMCkNCg0KIyBEbyBsb29wDQpmb3IgKGkgaW4gMTpjZWlsaW5nKDg0NyAvIGNob29zZSkpIHsNCiAgDQogICMgUHJlcGFyZSBwYXJhbGxlbCBsb29wDQogIG1pbmlfdGVtcCA8LSBudW1lcmljWywgKChpIC0gMSkgKiBjaG9vc2UgKyAxKTptaW4oKGkgKiBjaG9vc2UpLCA4NDcpLCB3aXRoID0gRkFMU0VdDQogIG1pbmlfdGVtcCR0YXJnZXQgPC0gdGFyZ2V0DQogIHNldERGKG1pbmlfdGVtcCkNCiAgY2x1c3RlckV4cG9ydChtY2wsIGMoIm1pbmlfdGVtcCIpKQ0KICANCiAgIyBQYXJhbGxlbCBsb29wIHNldHVwDQogIGlnX2ZyYW1lJElWX1Jhd1soKGkgLSAxKSAqIGNob29zZSArIDEpOm1pbigoaSAqIGNob29zZSksIDg0NyldIDwtIGZvcmVhY2goaiA9IDE6KChtaW4oKGkgKiBjaG9vc2UpLCA4NDcpIC0gKChpIC0gMSkgKiBjaG9vc2UgKyAxKSkgKyAxKSwgLmNvbWJpbmUgPSAiYyIsIC5pbm9yZGVyID0gVFJVRSwgLm5vZXhwb3J0ID0gIm1pbmlfdGVtcCIpICVkb3BhciUgew0KICAgIHNldC5zZWVkKDExMTExKQ0KICAgIHdoYXRldmVyIDwtIGl2Lm11bHQoZGYgPSBtaW5pX3RlbXAsDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gInRhcmdldCIsDQogICAgICAgICAgICAgICAgICAgICAgICB2YXJzID0gY29sbmFtZXMobWluaV90ZW1wKVtqXSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNxbCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9wYmluID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRicGN0ID0gMC4wMDAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gMTAwLCBjcCA9IDAuMDAwMDEsIHh2YWwgPSA1KSkNCiAgICByZXR1cm4oaWZlbHNlKGxlbmd0aCh3aGF0ZXZlcikgPT0gMCwgMCwgc3VtKHdoYXRldmVyW1sxXV0kbWl2LCBuYS5ybSA9IFRSVUUpKSkNCiAgfQ0KICBpbnZpc2libGUoY2x1c3RlckV2YWxRKG1jbCwgZ2ModmVyYm9zZSA9IEZBTFNFKSkpDQogIA0KICAjIEhhcnZlc3Qgc3RhdGlzdGljcw0KICBjYXQoIkJhdGNoICIsIGksICI6IG1lYW4gSVYgPSAiLCBtZWFuKGlnX2ZyYW1lJElWX1Jhd1soKGkgLSAxKSAqIGNob29zZSArIDEpOm1pbigoaSAqIGNob29zZSksIDg0NyldKSwgIiAgXG4iLCBzZXAgPSAiIikNCiAgQ3VycmVudFRpbWUgPC0gU3lzdGVtJGN1cnJlbnRUaW1lTWlsbGlzKCkNCiAgDQogIGlmIChpIDwgY2VpbGluZyg4NDcgLyBjaG9vc2UpKSB7DQogICAgDQogICAgRVRBIDwtIGlmZWxzZShpID09IGNlaWxpbmcoODQ3IC8gY2hvb3NlKSwgMCwgKCgoODQ3IC8gY2hvb3NlKSAtIGkpICogKEN1cnJlbnRUaW1lIC0gU3RhcnRUaW1lKSAvIGkgLyAxMDAwKSkNCiAgICBwYl90aXRsZSA8LSBwYXN0ZSgiSW5mb3JtYXRpb24gVmFsdWUgKFJhdykgY29tcHV0YXRpb24gW0NQVT0iLCBzcHJpbnRmKCIlMDcuMmYiLCAoQ3VycmVudFRpbWUgLSBTdGFydFRpbWUpIC8gMTAwMCksICJzIHwgRVRBPSIsIHNwcmludGYoIiUwNy4yZiIsIEVUQSksICJzXSIsIHNlcCA9ICIiKQ0KICAgIHBiX2l0ZXIgPC0gKChDdXJyZW50VGltZSAtIFN0YXJ0VGltZSkgLyAxMDAwKSAvIChpICogY2hvb3NlKQ0KICAgIHNldFdpblByb2dyZXNzQmFyKHBiLCB2YWx1ZSA9IGkgKiBjaG9vc2UsIHRpdGxlID0gcGJfdGl0bGUsIGxhYmVsID0gcGFzdGUoIlsiLCBmb3JtYXQoU3lzLnRpbWUoKSwgIiVYIiksICIgfCAiLCBzcHJpbnRmKCIlMDQuMmYiLCBwYl9pdGVyKSwgIiBzL2l0ZXJdIERvaW5nIGZlYXR1cmUgIiwgY29sbmFtZXMobnVtZXJpYylbaSAqIGNob29zZV0sICIgKCIsIHNwcmludGYoIiUwNGQiLCBpICogY2hvb3NlKSwgIiAvIDg0NyA9ICIsIHNwcmludGYoIiUwNS4yZiIsIDEwMCAqIChpICogY2hvb3NlKSAvIDg0NyksICIlKS4uLiIsIHNlcCA9ICIiKSkNCiAgDQogIH0NCiAgDQp9DQoNCmludmlzaWJsZShjbG9zZShwYikpDQpjYXQoIkluZm9ybWF0aW9uIFZhbHVlIChSYXcpIENvbXB1dGF0aW9uIHRpbWU6ICIsIHNwcmludGYoIiUwNy4yZiIsIChTeXN0ZW0kY3VycmVudFRpbWVNaWxsaXMoKSAtIFN0YXJ0VGltZSkgLyAxMDAwKSwgInMuICBcbiIsIHNlcCA9ICIiKQ0KY2F0KCJJbmZvcm1hdGlvbiBWYWx1ZSAoUmF3KSBKb2Igb3ZlciBvbiAiLCBmb3JtYXQoU3lzLnRpbWUoKSwgIiVhICViICVkICVZICVYIiksICIuICBcbiIsIHNlcCA9ICIiKQ0KYGBgDQoNCg0KYGBge3J9DQojIE9wdGltaXplZCBmb3IgbWF4aW11bSBzcGVlZA0KDQpnYyh2ZXJib3NlID0gVFJVRSkNCg0KU3RhcnRUaW1lIDwtIFN5c3RlbSRjdXJyZW50VGltZU1pbGxpcygpDQpjYXQoIkluZm9ybWF0aW9uIFZhbHVlIChUUykgSm9iIHN0YXJ0ZWQgb24gIiwgZm9ybWF0KFN5cy50aW1lKCksICIlYSAlYiAlZCAlWSAlWCIpLCAiLiAgXG4iLCBzZXAgPSAiIikNCnBiIDwtIHdpblByb2dyZXNzQmFyKHRpdGxlID0gIkluZm9ybWF0aW9uIFZhbHVlIChUUykgY29tcHV0YXRpb24iLCBsYWJlbCA9IHBhc3RlKCJbIiwgZm9ybWF0KFN5cy50aW1lKCksICIlYSAlYiAlZCAlWSAlWCIpLCAiXSBQcmVwYXJpbmcgY29tcHV0YXRpb24uLi4iLCBzZXAgPSAiIiksIG1pbiA9IDAsIG1heCA9IDg0NywgaW5pdGlhbCA9IDAsIHdpZHRoID0gNTIwKQ0KDQojIERvIGxvb3ANCmZvciAoaSBpbiAxOmNlaWxpbmcoODQ3IC8gY2hvb3NlKSkgew0KICANCiAgIyBQcmVwYXJlIHBhcmFsbGVsIGxvb3ANCiAgbWluaV90ZW1wIDwtIG51bWVyaWNbLCAoODQ3ICsgKChpIC0gMSkgKiBjaG9vc2UgKyAxKSk6KDg0NyArIG1pbigoaSAqIGNob29zZSksIDg0NykpLCB3aXRoID0gRkFMU0VdDQogIG1pbmlfdGVtcCR0YXJnZXQgPC0gdGFyZ2V0DQogIHNldERGKG1pbmlfdGVtcCkNCiAgY2x1c3RlckV4cG9ydChtY2wsIGMoIm1pbmlfdGVtcCIpKQ0KICANCiAgIyBQYXJhbGxlbCBsb29wIHNldHVwDQogIGlnX2ZyYW1lJElWX1RTWygoaSAtIDEpICogY2hvb3NlICsgMSk6bWluKChpICogY2hvb3NlKSwgODQ3KV0gPC0gZm9yZWFjaChqID0gMTooKG1pbigoaSAqIGNob29zZSksIDg0NykgLSAoKGkgLSAxKSAqIGNob29zZSArIDEpKSArIDEpLCAuY29tYmluZSA9ICJjIiwgLmlub3JkZXIgPSBUUlVFLCAubm9leHBvcnQgPSAibWluaV90ZW1wIikgJWRvcGFyJSB7DQogICAgc2V0LnNlZWQoMTExMTEpDQogICAgd2hhdGV2ZXIgPC0gaXYubXVsdChkZiA9IG1pbmlfdGVtcCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAidGFyZ2V0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMgPSBjb2xuYW1lcyhtaW5pX3RlbXApW2pdLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICB0b3BiaW4gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgdGJwY3QgPSAwLjAwMDEsDQogICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICByY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMDAsIGNwID0gMC4wMDAwMSwgeHZhbCA9IDUpKQ0KICAgIHJldHVybihpZmVsc2UobGVuZ3RoKHdoYXRldmVyKSA9PSAwLCAwLCBzdW0od2hhdGV2ZXJbWzFdXSRtaXYsIG5hLnJtID0gVFJVRSkpKQ0KICB9DQogIGludmlzaWJsZShjbHVzdGVyRXZhbFEobWNsLCBnYyh2ZXJib3NlID0gRkFMU0UpKSkNCiAgDQogICMgSGFydmVzdCBzdGF0aXN0aWNzDQogIGNhdCgiQmF0Y2ggIiwgaSwgIjogbWVhbiBJViA9ICIsIG1lYW4oaWdfZnJhbWUkSVZfVFNbKChpIC0gMSkgKiBjaG9vc2UgKyAxKTptaW4oKGkgKiBjaG9vc2UpLCA4NDcpXSksICIgIFxuIiwgc2VwID0gIiIpDQogIEN1cnJlbnRUaW1lIDwtIFN5c3RlbSRjdXJyZW50VGltZU1pbGxpcygpDQogIA0KICBpZiAoaSA8IGNlaWxpbmcoODQ3IC8gY2hvb3NlKSkgew0KICAgIA0KICAgIEVUQSA8LSBpZmVsc2UoaSA9PSBjZWlsaW5nKDg0NyAvIGNob29zZSksIDAsICgoKDg0NyAvIGNob29zZSkgLSBpKSAqIChDdXJyZW50VGltZSAtIFN0YXJ0VGltZSkgLyBpIC8gMTAwMCkpDQogICAgcGJfdGl0bGUgPC0gcGFzdGUoIkluZm9ybWF0aW9uIFZhbHVlIChUUykgY29tcHV0YXRpb24gW0NQVT0iLCBzcHJpbnRmKCIlMDcuMmYiLCAoQ3VycmVudFRpbWUgLSBTdGFydFRpbWUpIC8gMTAwMCksICJzIHwgRVRBPSIsIHNwcmludGYoIiUwNy4yZiIsIEVUQSksICJzXSIsIHNlcCA9ICIiKQ0KICAgIHBiX2l0ZXIgPC0gKChDdXJyZW50VGltZSAtIFN0YXJ0VGltZSkgLyAxMDAwKSAvIChpICogY2hvb3NlKQ0KICAgIHNldFdpblByb2dyZXNzQmFyKHBiLCB2YWx1ZSA9IGkgKiBjaG9vc2UsIHRpdGxlID0gcGJfdGl0bGUsIGxhYmVsID0gcGFzdGUoIlsiLCBmb3JtYXQoU3lzLnRpbWUoKSwgIiVYIiksICIgfCAiLCBzcHJpbnRmKCIlMDQuMmYiLCBwYl9pdGVyKSwgIiBzL2l0ZXJdIERvaW5nIGZlYXR1cmUgIiwgY29sbmFtZXMobnVtZXJpYylbaSAqIGNob29zZV0sICIgKCIsIHNwcmludGYoIiUwNGQiLCBpICogY2hvb3NlKSwgIiAvIDg0NyA9ICIsIHNwcmludGYoIiUwNS4yZiIsIDEwMCAqIChpICogY2hvb3NlKSAvIDg0NyksICIlKS4uLiIsIHNlcCA9ICIiKSkNCiAgDQogIH0NCiAgDQp9DQoNCmludmlzaWJsZShjbG9zZShwYikpDQpjYXQoIkluZm9ybWF0aW9uIFZhbHVlIChUUykgQ29tcHV0YXRpb24gdGltZTogIiwgc3ByaW50ZigiJTA3LjJmIiwgKFN5c3RlbSRjdXJyZW50VGltZU1pbGxpcygpIC0gU3RhcnRUaW1lKSAvIDEwMDApLCAicy4gIFxuIiwgc2VwID0gIiIpDQpjYXQoIkluZm9ybWF0aW9uIFZhbHVlIChUUykgSm9iIG92ZXIgb24gIiwgZm9ybWF0KFN5cy50aW1lKCksICIlYSAlYiAlZCAlWSAlWCIpLCAiLiAgXG4iLCBzZXAgPSAiIikNCmBgYA0KDQojIyBLaWxsIG11bHRpdGhyZWFkaW5nDQoNCmBgYHtyfQ0KcmVnaXN0ZXJEb1NFUSgpDQpzdG9wQ2x1c3RlcihtY2wpDQpjbG9zZUFsbENvbm5lY3Rpb25zKCkNCmBgYA0KDQoNCiMjIFNldHVwIGZlYXR1cmUgbmFtZXMgcHJvcGVybHkNCg0KYGBge3J9DQphbGxfZnJhbWUgPC0gaWdfZnJhbWUNCmFsbF9mcmFtZSRSYW5rSVZfUmF3IDwtIChucm93KGFsbF9mcmFtZSkgKyAxKSAtIHJhbmsoYWxsX2ZyYW1lJElWX1JhdywgdGllcy5tZXRob2QgPSAibWF4IikNCmFsbF9mcmFtZSRSYW5rSVZfVFMgPC0gKG5yb3coYWxsX2ZyYW1lKSArIDEpIC0gcmFuayhhbGxfZnJhbWUkSVZfVFMsIHRpZXMubWV0aG9kID0gIm1heCIpDQphbGxfZnJhbWUkVFN2c1JhdyA8LSByZXAoIiIsIG5yb3coYWxsX2ZyYW1lKSkNCmFsbF9mcmFtZSRUU3ZzUmF3W2FsbF9mcmFtZSRJVl9SYXcgPiBhbGxfZnJhbWUkSVZfVFNdIDwtICJSYXciDQphbGxfZnJhbWUkVFN2c1Jhd1thbGxfZnJhbWUkSVZfUmF3IDwgYWxsX2ZyYW1lJElWX1RTXSA8LSAiVFMiDQphbGxfZnJhbWUkVFN2c1Jhd1thbGxfZnJhbWUkSVZfUmF3ID09IGFsbF9mcmFtZSRJVl9UU10gPC0gIk5vbmUiDQphbGxfZnJhbWUkVFN2c1JhdyA8LSBhcy5mYWN0b3IoYWxsX2ZyYW1lJFRTdnNSYXcpDQpnYyh2ZXJib3NlID0gVFJVRSkNCmZ3cml0ZShhbGxfZnJhbWUsICJFOi9MYXVyYWUvTnVtZXJpY0NNSV9leGFjdF9iZXN0X2dyaWQvSVZfVFNmZWF0LmNzdiIpDQpgYGANCg0KIyMgV2hhdCBpcyBiZXR0ZXINCg0KU3VtbWFyeSA6DQoNCiogVGhlcmUgYXJlIGByIHN1bShhbGxfZnJhbWUkVFN2c1JhdyA9PSAiVFMiKWAgZmVhdHVyZXMgaGF2aW5nIGhpZ2hlciBJbmZvcm1hdGlvbiBWYWx1ZSB1c2luZyB0aGUgc3RhdGlvbmFyeSB0aW1lLXNlcmllcyBibGVuZGVyLiBUaGUgaW5jcmVhc2UgY2FuIHJlYWNoIHVwIHRvIGByIG1heChhbGxfZnJhbWUkSVZfVFNbYWxsX2ZyYW1lJFRTdnNSYXcgPT0gIlRTIl0pYC4NCiogVGhlcmUgYXJlIGByIHN1bShhbGxfZnJhbWUkVFN2c1JhdyA9PSAiUmF3IilgIGZlYXR1cmVzIGhhdmluZyBsb3dlciBJbmZvcm1hdGlvbiBWYWx1ZSB1c2luZyB0aGUgc3RhdGlvbmFyeSB0aW1lLXNlcmllcyBibGVuZGVyLg0KKiBUaGVyZSBhcmUgYHIgc3VtKGFsbF9mcmFtZSRUU3ZzUmF3ID09ICJOb25lIilgIGZlYXR1cmVzIGhhdmluZyBubyBjaGFuZ2UgdXNpbmcgdGhlIHN0YXRpb25hcnkgdGltZS1zZXJpZXMgYmxlbmRlci4NCg0KDQojIyBQcmV0dHkgcHJpbnQgRFQgSW5mb3JtYXRpb24gVmFsdWUNCg0KYGBge3J9DQpkYXRhdGFibGUoYWxsX2ZyYW1lLA0KICAgICAgICAgIGZpbHRlciA9ICJ0b3AiLA0KICAgICAgICAgIGNsYXNzID0gImNlbGwtYm9yZGVyIHN0cmlwZSIsDQogICAgICAgICAgcGx1Z2lucyA9ICJuYXR1cmFsIiwNCiAgICAgICAgICBleHRlbnNpb25zID0gYygiQXV0b0ZpbGwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICMiQnV0dG9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbFJlb3JkZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlUYWJsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIlJlc3BvbnNpdmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJSb3dSZW9yZGVyIiksDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc3R5bGUgPSAiYm9vdHN0cmFwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMjAsDQogICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoTWVudSA9IGMoNSwgMTAsIDE1LCAyMCwgMjUsIDUwLCAxMDAsIDI1MCwgNTAwLCAxMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciA9IGxpc3QobGlzdCg1LCAiZGVzYyIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZmlsbCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgI2RvbSA9ICJCZnJ0aXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICNidXR0b25zID0gYygiY29weSIsICJjc3YiLCAiZXhjZWwiLCAicGRmIiwgInByaW50IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgY29sUmVvcmRlciA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgcm93UmVvcmRlciA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSGlnaGxpZ2h0ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2ggPSBsaXN0KHJlZ2V4ID0gVFJVRSwgY2FzZUluc2Vuc2l0aXZlID0gRkFMU0UpKQ0KICAgICAgICAgICkgJT4lIGZvcm1hdFN0eWxlKCdJVl9SYXcnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gc3R5bGVDb2xvckJhcihyYW5nZShhbGxfZnJhbWUkSVZfUmF3LCBuYS5ybSA9IFRSVUUsIGZpbml0ZSA9IFRSVUUpLCAnbGlnaHRncmVlbicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kU2l6ZSA9ICcxMDAlIDkwJScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRSZXBlYXQgPSAnbm8tcmVwZWF0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uID0gJ2NlbnRlcicpICU+JQ0KICAgICAgICAgICAgICAgIGZvcm1hdFN0eWxlKCdJVl9UUycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBzdHlsZUNvbG9yQmFyKHJhbmdlKGFsbF9mcmFtZSRJVl9UUywgbmEucm0gPSBUUlVFLCBmaW5pdGUgPSBUUlVFKSwgJ3BpbmsnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFNpemUgPSAnMTAwJSA5MCUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kUmVwZWF0ID0gJ25vLXJlcGVhdCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRQb3NpdGlvbiA9ICdjZW50ZXInKSAlPiUNCiAgICAgICAgICAgICAgICBmb3JtYXRTdHlsZSgnTm90TWlzc2luZycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBzdHlsZUNvbG9yQmFyKGMoMCwgMSksICdsaWdodGdyZXknKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFNpemUgPSAnMTAwJSA5MCUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kUmVwZWF0ID0gJ25vLXJlcGVhdCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRQb3NpdGlvbiA9ICdjZW50ZXInKSAlPiUNCiAgICAgICAgICAgICAgICBmb3JtYXRTdHlsZSgnTGV2ZWxzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IHN0eWxlQ29sb3JCYXIocmFuZ2UoYWxsX2ZyYW1lJExldmVscywgbmEucm0gPSBUUlVFLCBmaW5pdGUgPSBUUlVFKSwgJ2xpZ2h0Z3JleScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kU2l6ZSA9ICcxMDAlIDkwJScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRSZXBlYXQgPSAnbm8tcmVwZWF0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uID0gJ2NlbnRlcicpICU+JQ0KICAgICAgICAgICAgICAgIGZvcm1hdFJvdW5kKGNvbHVtbnMgPSBjKCJJVl9SYXciKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA4KSAlPiUNCiAgICAgICAgICAgICAgICBmb3JtYXRSb3VuZChjb2x1bW5zID0gYygiSVZfVFMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA4KSAlPiUNCiAgICAgICAgICAgICAgICBmb3JtYXRQZXJjZW50YWdlKGNvbHVtbnMgPSBjKCJOb3RNaXNzaW5nIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA0KQ0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTE0LCBmaWcud2lkdGg9MTh9DQpwbG90dGluZyA8LSBnZ3Bsb3QoYWxsX2ZyYW1lLCBhZXMoeCA9IElWX1JhdywgeSA9IElWX1RTLCBjb2xvciA9IFJhbmtJVl9SYXcsIGNvbG9yMiA9IFJhbmtJVl9UUykpICsgbGFicyh0aXRsZSA9ICJJViBUaW1lLVNlcmllcyB2cyBJViBSYXcgRGF0YSwgUmFuayBNdWx0aXZhcmlhdGUiLCB4ID0gIkluZm9ybWF0aW9uIFZhbHVlIChSYXcgRGF0YSkiLCB5ID0gIkluZm9ybWF0aW9uIFZhbHVlIChUaW1lLVNlcmllcykiKSArIHRoZW1lX2J3KCkgKyBnZW9tX3J1ZygpICsgc2NhbGVfY29sb3JfY29sb3JwbGFuZShheGlzX3RpdGxlID0gIklWIFJhbmsgKFJhdyBEYXRhKSIsIGF4aXNfdGl0bGVfeSA9ICJJViBSYW5rIChUaW1lLVNlcmllcykiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSwgZmFjZSA9ICJib2xkIiksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSkpICsgZ2VvbV9wb2ludF9pbnRlcmFjdGl2ZShhZXModG9vbHRpcCA9IEZlYXR1cmUpLCBzaXplID0gMikNCmdnaXJhcGgoY29kZSA9IHByaW50KHBsb3R0aW5nKSwgd2lkdGhfc3ZnID0gMTgsIGhlaWdodF9zdmcgPSAxNCwgem9vbV9tYXggPSA1KQ0KcGxvdHRpbmcgPC0gZ2dwbG90KGFsbF9mcmFtZSwgYWVzKHggPSBSYW5rSVZfUmF3LCB5ID0gUmFua0lWX1RTLCBjb2xvciA9IElWX1JhdywgY29sb3IyID0gSVZfVFMpKSArIGxhYnModGl0bGUgPSAiSVYgUmFuayBUaW1lLVNlcmllcyB2cyBJViBSYW5rIFJhdyBEYXRhLCBSYW5rIE11bHRpdmFyaWF0ZSIsIHggPSAiSW5mb3JtYXRpb24gVmFsdWUgUmFuayAoUmF3IERhdGEpIiwgeSA9ICJJbmZvcm1hdGlvbiBWYWx1ZSBSYW5rIChUaW1lLVNlcmllcykiKSArIHRoZW1lX2J3KCkgKyBnZW9tX3J1ZygpICsgc2NhbGVfY29sb3JfY29sb3JwbGFuZShheGlzX3RpdGxlID0gIklWIChSYXcgRGF0YSkiLCBheGlzX3RpdGxlX3kgPSAiSVYgKFRpbWUtU2VyaWVzKSIpICsgc2NhbGVfeF9yZXZlcnNlKGxpbSA9IHJldihyYW5nZShhbGxfZnJhbWUkUmFua0lWX1JhdykpKSArIHNjYWxlX3lfcmV2ZXJzZShsaW0gPSByZXYocmFuZ2UoYWxsX2ZyYW1lJFJhbmtJVl9UUykpKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSwgZmFjZSA9ICJib2xkIiksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSkpICsgZ2VvbV9wb2ludF9pbnRlcmFjdGl2ZShhZXModG9vbHRpcCA9IEZlYXR1cmUpLCBzaXplID0gMikNCmdnaXJhcGgoY29kZSA9IHByaW50KHBsb3R0aW5nKSwgd2lkdGhfc3ZnID0gMTgsIGhlaWdodF9zdmcgPSAxNCwgem9vbV9tYXggPSA1KQ0KcGxvdHRpbmcgPC0gZ2dwbG90KGFsbF9mcmFtZSwgYWVzKHggPSBJVl9SYXcsIHkgPSBJVl9UUywgY29sb3IgPSBMZXZlbHMsIGNvbG9yMiA9IE5vdE1pc3NpbmcpKSArIGxhYnModGl0bGUgPSAiSVYgVGltZS1TZXJpZXMgdnMgSVYgUmF3IERhdGEsIExldmVscy9Ob3QtbWlzc2luZyBNdWx0aXZhcmlhdGUiLCB4ID0gIkluZm9ybWF0aW9uIFZhbHVlIChSYXcgRGF0YSkiLCB5ID0gIkluZm9ybWF0aW9uIFZhbHVlIChUaW1lLVNlcmllcykiKSArIHRoZW1lX2J3KCkgKyBnZW9tX3J1ZygpICsgc2NhbGVfY29sb3JfY29sb3JwbGFuZShheGlzX3RpdGxlID0gIkxldmVscyIsIGF4aXNfdGl0bGVfeSA9ICJOb3QtbWlzc2luZyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpLCBmYWNlID0gImJvbGQiKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSkgKyBnZW9tX3BvaW50X2ludGVyYWN0aXZlKGFlcyh0b29sdGlwID0gRmVhdHVyZSksIHNpemUgPSAyKQ0KZ2dpcmFwaChjb2RlID0gcHJpbnQocGxvdHRpbmcpLCB3aWR0aF9zdmcgPSAxOCwgaGVpZ2h0X3N2ZyA9IDE0LCB6b29tX21heCA9IDUpDQpwbG90dGluZyA8LSBnZ3Bsb3QoYWxsX2ZyYW1lLCBhZXMoeCA9IFJhbmtJVl9SYXcsIHkgPSBSYW5rSVZfVFMsIGNvbG9yID0gTGV2ZWxzLCBjb2xvcjIgPSBOb3RNaXNzaW5nKSkgKyBsYWJzKHRpdGxlID0gIklWIFJhbmsgVGltZS1TZXJpZXMgdnMgSVYgUmFuayBSYXcgRGF0YSwgTGV2ZWxzL05vdC1taXNzaW5nIE11bHRpdmFyaWF0ZSIsIHggPSAiSW5mb3JtYXRpb24gVmFsdWUgUmFuayAoUmF3IERhdGEpIiwgeSA9ICJJbmZvcm1hdGlvbiBWYWx1ZSBSYW5rIChUaW1lLVNlcmllcykiKSArIHRoZW1lX2J3KCkgKyBnZW9tX3J1ZygpICsgc2NhbGVfY29sb3JfY29sb3JwbGFuZShheGlzX3RpdGxlID0gIkxldmVscyIsIGF4aXNfdGl0bGVfeSA9ICJOb3QtbWlzc2luZyIpICsgc2NhbGVfeF9yZXZlcnNlKGxpbSA9IHJldihyYW5nZShhbGxfZnJhbWUkUmFua0lWX1JhdykpKSArIHNjYWxlX3lfcmV2ZXJzZShsaW0gPSByZXYocmFuZ2UoYWxsX2ZyYW1lJFJhbmtJVl9UUykpKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSwgZmFjZSA9ICJib2xkIiksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSkpICsgZ2VvbV9wb2ludF9pbnRlcmFjdGl2ZShhZXModG9vbHRpcCA9IEZlYXR1cmUpLCBzaXplID0gMikNCmdnaXJhcGgoY29kZSA9IHByaW50KHBsb3R0aW5nKSwgd2lkdGhfc3ZnID0gMTgsIGhlaWdodF9zdmcgPSAxNCwgem9vbV9tYXggPSA1KQ0KcGxvdHRpbmcgPC0gZ2dwbG90KGFsbF9mcmFtZSwgYWVzKHggPSBMZXZlbHMsIHkgPSBOb3RNaXNzaW5nLCBjb2xvciA9IElWX1JhdywgY29sb3IyID0gSVZfVFMpKSArIGxhYnModGl0bGUgPSAiTm90LW1pc3NpbmcgdnMgTGV2ZWxzLCBJViBUaW1lLVNlcmllcyAvIFJhdyBEYXRhIE11bHRpdmFyaWF0ZSIsIHggPSAiTGV2ZWxzIiwgeSA9ICJOb3QtbWlzc2luZyIpICsgdGhlbWVfYncoKSArIGdlb21fcnVnKCkgKyBzY2FsZV9jb2xvcl9jb2xvcnBsYW5lKGF4aXNfdGl0bGUgPSAiSVYgKFJhdyBEYXRhKSIsIGF4aXNfdGl0bGVfeSA9ICJJViAoVGltZS1TZXJpZXMpIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMiksIGZhY2UgPSAiYm9sZCIpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpKSArIGdlb21fcG9pbnRfaW50ZXJhY3RpdmUoYWVzKHRvb2x0aXAgPSBGZWF0dXJlKSwgc2l6ZSA9IDIpDQpnZ2lyYXBoKGNvZGUgPSBwcmludChwbG90dGluZyksIHdpZHRoX3N2ZyA9IDE4LCBoZWlnaHRfc3ZnID0gMTQsIHpvb21fbWF4ID0gNSkNCnBsb3R0aW5nIDwtIGdncGxvdChhbGxfZnJhbWUsIGFlcyh4ID0gTGV2ZWxzLCB5ID0gTm90TWlzc2luZywgY29sb3IgPSBSYW5rSVZfUmF3LCBjb2xvcjIgPSBSYW5rSVZfVFMpKSArIGxhYnModGl0bGUgPSAiTm90LW1pc3NpbmcgdnMgTGV2ZWxzLCBJViBSYW5rIFRpbWUtU2VyaWVzIC8gUmF3IERhdGEgTXVsdGl2YXJpYXRlIiwgeCA9ICJMZXZlbHMiLCB5ID0gIk5vdC1taXNzaW5nIikgKyB0aGVtZV9idygpICsgZ2VvbV9ydWcoKSArIHNjYWxlX2NvbG9yX2NvbG9ycGxhbmUoYXhpc190aXRsZSA9ICJJViBSYW5rIChSYXcgRGF0YSkiLCBheGlzX3RpdGxlX3kgPSAiSVYgUmFuayAoVGltZS1TZXJpZXMpIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMiksIGZhY2UgPSAiYm9sZCIpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIpKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMikpKSArIGdlb21fcG9pbnRfaW50ZXJhY3RpdmUoYWVzKHRvb2x0aXAgPSBGZWF0dXJlKSwgc2l6ZSA9IDIpDQpnZ2lyYXBoKGNvZGUgPSBwcmludChwbG90dGluZyksIHdpZHRoX3N2ZyA9IDE4LCBoZWlnaHRfc3ZnID0gMTQsIHpvb21fbWF4ID0gNSkNCmBgYA0KDQo=